<template>
  <div class="prodetail">
    <van-nav-bar fixed title="商品详情页" left-arrow @click-left="$router.go(-1)" />
    <!-- 轮播区域 -->
    <van-swipe :autoplay="3000" @change="onChange">
      <!-- 我们这里得到的是image对象 轮播图的位置应该是这个对象当中的某一项 同时我们使用这个对象当中的file_id作为key的值 -->
      <van-swipe-item v-for="(image) in images" :key="image.file_id">
        <img :src="image.external_url" />
      </van-swipe-item>
      <!-- 提示器#indicator -->
      <template #indicator>
        <div class="custom-indicator">{{ current + 1 }} / {{ images.length }}</div>
      </template>
    </van-swipe>

    <!-- 商品说明 -->
    <div class="info">
      <div class="title">
        <div class="price">
          <span class="now">￥{{ detail.goods_price_min }}</span>
          <span class="oldprice">￥{{ detail.goods_price_max }}</span>
        </div>
        <div class="sellcount">已售{{ detail.goods_sales }}件</div>
      </div>
      <div class="msg text-ellipsis-2">
        {{ detail.goods_name }}
      </div>

      <div class="service">
        <div class="left-words">
          <span><van-icon name="passed" />七天无理由退货</span>
          <span><van-icon name="passed" />48小时发货</span>
        </div>
        <div class="right-icon">
          <van-icon name="arrow" />
        </div>
      </div>
    </div>

    <!-- 商品评价 -->
    <div class="comment">
      <div class="comment-title">
        <div class="left">商品评价 ({{ total }}条)</div>
        <div class="right">查看更多 <van-icon name="arrow" /> </div>
      </div>
      <div class="comment-list">
        <div class="comment-item" v-for="item in commentList" :key="item.commentList_id">
          <div class="top">
            <!-- 我们在处理用户头像的时候要多处理一下 防止有些用户没有头像我们需要给用户一个默认的头像 -->
            <img :src="item.user.avatar_url || defaultImg" alt="">
            <div class="name">{{ item.user.nick_name }}</div>
            <!-- 评分组件 -->
            <!-- 这里的星数我们要除以2 因为后台数据给的满分是10分 折算成星数就是分数的一半 -->
            <van-rate :size="16" :value="item.score / 2" color="#ffd21e" void-icon="star" void-color="#eee" />
          </div>
          <div class="content">
            {{ item.content }}
          </div>
          <div class="time">
            {{ item.create_time }}
          </div>
        </div>
      </div>
    </div>

    <!-- 商品描述 -->
    <!-- 我们这里使用v-html来解析后台发送的图片数据 -->
    <div class="desc" v-html="detail.content"></div>

    <!-- 加入购物车/立即购买的弹层 -->
    <!-- 我们给标题设置了两个状态一个是cart表示加入购物车 另外一个状态是buyNow表示立即购买 所以我们这里给标题做一个三目运算要么是加入购物车(cart) 要么是立刻购买 -->
    <!-- 我们 -->
    <van-action-sheet v-model="showPannel" :title="mode === 'cart' ? '加入购物车' : '立刻购买'">
      <div class="product">
        <div class="product-title">
          <div class="left">
            <img :src="detail.goods_image" alt="">
          </div>
          <div class="right">
            <div class="price">
              <span>¥</span>
              <span class="nowprice">{{ detail.goods_price_min }}</span>
            </div>
            <div class="count">
              <span>库存</span>
              <span>{{ detail.stock_total }}</span>
            </div>
          </div>
        </div>
        <div class="num-box">
          <span>数量</span>
          <!-- 数量组件 -->
          <!-- v-model应用于组件本质上就是 :value 和 @input 的简写 -->
          <CountBox v-model="addCount"></CountBox>
        </div>
        <!-- 我们这里做一个判断 如果商品的库存大于0 则显示 否则显示该商品已抢完 -->
        <div class="showbtn" v-if="detail.stock_total > 0">
          <div class="btn" v-if="mode === 'cart'" @click="addCart">加入购物车</div>
          <div class="btn now" v-else @click="goBuyNow">立刻购买</div>
        </div>
        <div class="btn-none" v-else>该商品已抢完</div>
      </div>
    </van-action-sheet>

    <!-- 底部 -->
    <div class="footer">
      <div class="icon-home" @click="$router.push('/')">
        <van-icon name="wap-home-o" />
        <span>首页</span>
      </div>
      <div class="icon-cart" @click="$router.push('/cart')">
        <span v-if="cartTotal > 0" class="num">{{ cartTotal }}</span>
        <van-icon name="shopping-cart-o" />
        <span>购物车</span>
      </div>
      <div class="btn-add" @click="addFn">加入购物车</div>
      <div class="btn-buy" @click="buyFn">立刻购买</div>
    </div>
  </div>
</template>

<script>
import { getProDetail, getProComments } from '@/api/product'
import defaultImg from '@/assets/default-avatar.png'
// 导入商品数量组件
import CountBox from '@/components/CountBox'
// 导入加入购物车方法
import { addCart } from '@/api/cart'
export default {
  name: 'ProDetail',
  // 注册局部组件
  components: {
    CountBox
  },
  data () {
    return {
      images: [], // 轮播图
      current: 0,
      detail: {},
      total: 0, // 评价总数
      commentList: [], // 评价列表
      defaultImg, // 默认的用户头像
      showPannel: false, // 加入购物车的弹层 默认是false隐藏的 只有用户点击加入购物车的时候才会显示 改为true
      mode: 'cart', // 标记弹窗状态 只有两个值 cart 加入购物车 buyNow 立即购买
      addCount: 1, // 数字框绑定的数据
      cartTotal: 0 // 购物车角标
    }
  },
  computed: {
    goodsId () {
      return this.$route.params.id
    }
  },
  created () {
    this.getDetail()
    this.getProComments()
  },
  methods: {
    // 用来控制轮播图的
    onChange (index) {
      this.current = index
    },
    async getDetail () {
      const { data: { detail } } = await getProDetail(this.goodsId)
      this.detail = detail
      this.images = detail.goods_images
    },
    async getProComments () {
      // 第一个参数是商品id，第二个参数是评价的条数
      const { data: { list, total } } = await getProComments(this.goodsId, 3)
      this.total = total
      this.commentList = list
    },
    // 加入购物车
    addFn () {
      this.mode = 'cart'
      this.showPannel = true
    },
    // 立即购买
    buyFn () {
      this.mode = 'buyNow'
      this.showPannel = true
    },
    // 根据登录状态 判断是否显示登录确认框
    // 如果是 未登录 则显示确认框 返回true
    // 如果是 已登录 则啥也不干   返回false
    loginConfirm () {
      if (!this.$store.getters.token) {
        // token不存在 弹消息提示用户登录
        // 这里使用的是 vant组件 当中的 Dailog弹窗 组件
        // .then表示当用户点击确认以后要干的事情
        // .catch表示当用户点击取消以后要干的事情
        this.$dialog.confirm({
          title: '温馨提示',
          message: '此时需要登录才能操作哦',
          // 写入配置项confirmButtonText 确认按钮的文案 cancelButtonText取消按钮文案
          confirmButtonText: '去登录',
          cancelButtonText: '再逛逛'
        })
          .then(() => {
            this.$router.replace({
              path: '/login',
              query: {
                backUrl: this.$route.fullPath
              }
            })
          // 用户点击取消以后我们不进行操作
          })
          .catch(() => { })
        return true
      }
      return false
    },
    //  加入购物车
    async addCart () {
      //  判断token是否存在 如果token不存在则需要弹消息提示用户登录 若存在继续请求操作
      if (this.loginConfirm()) {
        // 如果我们返回了true 那么说明用户点击了取消按钮 此时我们什么都不干
        return
      }
      const { data } = await addCart(this.goodsId, this.addCount, this.detail.skuList[0].goods_sku_id)
      this.cartTotal = data.cartTotal
      this.$toast.success('加入购物车成功')
      this.showPannel = false
    },
    // 点击立即购买跳转到订单页
    goBuyNow () {
      // 我们还要防止用户未登录
      // 未登录的处理:需要弹出一个确认框 您当前的操作需要登录才能继续操作
      // 此时会有两个选项供用户点击: 去登录 和 再逛逛
      if (this.loginConfirm()) {
        // 如果我们返回了true 那么说明用户点击了取消按钮 此时我们什么都不干
        return
      }
      this.$router.push({
        path: '/pay',
        query: {
          mode: 'buyNow',
          goodsId: this.goodsId,
          goodsSkuId: this.detail.skuList[0].goods_sku_id,
          goodsNum: this.addCount
        }
      })
    }

  }
}
</script>

<style lang="less" scoped>
.prodetail {
  padding-top: 46px;

  ::v-deep .van-icon-arrow-left {
    color: #333;
  }

  img {
    display: block;
    width: 100%;
  }

  .custom-indicator {
    position: absolute;
    right: 10px;
    bottom: 10px;
    padding: 5px 10px;
    font-size: 12px;
    background: rgba(0, 0, 0, 0.1);
    border-radius: 15px;
  }

  .desc {
    width: 100%;
    overflow: scroll;

    ::v-deep img {
      display: block;
      width: 100% !important;
    }
  }

  .info {
    padding: 10px;
  }

  .title {
    display: flex;
    justify-content: space-between;

    .now {
      color: #fa2209;
      font-size: 20px;
    }

    .oldprice {
      color: #959595;
      font-size: 16px;
      text-decoration: line-through;
      margin-left: 5px;
    }

    .sellcount {
      color: #959595;
      font-size: 16px;
      position: relative;
      top: 4px;
    }
  }

  .msg {
    font-size: 16px;
    line-height: 24px;
    margin-top: 5px;
  }

  .service {
    display: flex;
    justify-content: space-between;
    line-height: 40px;
    margin-top: 10px;
    font-size: 16px;
    background-color: #fafafa;

    .left-words {
      span {
        margin-right: 10px;
      }

      .van-icon {
        margin-right: 4px;
        color: #fa2209;
      }
    }
  }

  .comment {
    padding: 10px;
  }

  .comment-title {
    display: flex;
    justify-content: space-between;

    .right {
      color: #959595;
    }
  }

  .comment-item {
    font-size: 16px;
    line-height: 30px;

    .top {
      height: 30px;
      display: flex;
      align-items: center;
      margin-top: 20px;

      img {
        width: 20px;
        height: 20px;
      }

      .name {
        margin: 0 10px;
      }
    }

    .time {
      color: #999;
    }
  }

  .footer {
    position: fixed;
    left: 0;
    bottom: 0;
    width: 100%;
    height: 55px;
    background-color: #fff;
    border-top: 1px solid #ccc;
    display: flex;
    justify-content: space-evenly;
    align-items: center;

    .icon-home,
    .icon-cart {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      font-size: 14px;

      .van-icon {
        font-size: 24px;
      }
    }

    .btn-add,
    .btn-buy {
      height: 36px;
      line-height: 36px;
      width: 120px;
      border-radius: 18px;
      background-color: #ffa900;
      text-align: center;
      color: #fff;
      font-size: 14px;
    }

    .btn-buy {
      background-color: #fe5630;
    }
  }
}

.tips {
  padding: 10px;
}
// 弹层样式
.product {
  .product-title {
    display: flex;

    .left {
      img {
        width: 90px;
        height: 90px;
      }

      margin: 10px;
    }

    .right {
      flex: 1;
      padding: 10px;

      .price {
        font-size: 14px;
        color: #fe560a;

        .nowprice {
          font-size: 24px;
          margin: 0 5px;
        }
      }
    }
  }

  .num-box {
    display: flex;
    justify-content: space-between;
    padding: 10px;
    align-items: center;
  }

  .btn,
  .btn-none {
    height: 40px;
    line-height: 40px;
    margin: 20px;
    border-radius: 20px;
    text-align: center;
    color: rgb(255, 255, 255);
    background-color: rgb(255, 148, 2);
  }

  .btn.now {
    background-color: #fe5630;
  }

  .btn-none {
    background-color: #cccccc;
  }
}
// 角标样式
.footer .icon-cart {
  position: relative;
  padding: 0 6px;
  .num{
    z-index: 99;
    position: absolute;
    top: -2px;
    right: 0;
    min-width: 16px;
    padding: 0 4px;
    color: #fff;
    text-align: center;
    background-color: #ee0a24;
    border-radius: 50%;
  }
}
</style>
